home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
c
/
stut_src
/
windows.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-05-27
|
52KB
|
2,020 lines
/*
* windows.c
*
* Purpose:
* --------
* GESTION DES FENETERES sous GEM
*
* - resize
* - ouverture
* - fermeture
*
* - ajout dans une liste de fenetres
* - retrait d'une liste de fenetres
* - amener une fentre au premier plan
* - trouver une fentres ds une liste selon critres
*
* - taille des ascenseurs
* - position des ascenseurs
*
* - options menu concernant les fentres
*
* History:
* --------
* 1993: fplanque: Created
* 17.06.94: fplanque: routines de redraw extraites vers REDRAW.C
*/
#include "!OPTIONS.H" /* Options de compilation */
#define THIS_FILE "WINDOWS.C v1.00 - 03.95"
/*
* System headers:
*/
#include <stdio.h> /* header standard */
#include <stdlib.h> /* header librairie de fnct std */
#include <string.h> /* header tt de chaines */
#include <tos.h>
#include <aes.h> /* header AES */
#include <vdi.h> /* header VDI */
/*
* Custom headers:
*/
#include "SPEC_PU.H"
#include "S_MALLOC.H"
#include "STUT_ONE.RSC\STUT_3.H" /* noms des objets ds le ressource */
#include "WIN_PU.H"
#include "WINDR_PU.H"
#include "TEXT_PU.H" /* Infos sur texte VDI */
#include "AESDEF.H"
#include "VDI_PU.H"
#include "DEBUG_PU.H"
#include "RTERR_PU.H"
#include "ARBPG_PU.H"
#include "ATREE_PU.H"
#include "MAIN_PU.H"
#include "MMENU_PU.H"
#include "DTDIR_PU.H"
/*
* ------------------------ PROTOTYPES -------------------------
*/
/*
* EXTernal prototypes:
*/
/*
* Images:
*/
extern void pi3_optimal( int wi_ckind, int *border_x, int *border_y, int *border_w, int *border_h);
extern int access_image( DATAPAGE *datapage, WORK_CONTENT *content_ptr, WORK_DRAW *draw_ptr );
extern void open_pi3( WIPARAMS *pWiParams, DATAPAGE *content_ptr, MFDB *draw_ptr );
/*
* Objets:
*/
extern void dir_optimal( int *x_full, int *y_full, int *w_full, int *h_full);
extern void open_dir(
WIPARAMS *pWiParams,
DATADIR * pDataDir,
int x_work, int y_work, int w_work );
extern void efface_dir( WIPARAMS *pWiParams );
extern char *dir_infoline( WIPARAMS *pWiParams );
extern char *arbo_infoline( WIPARAMS *pWiParams );
/*
* Datas:
*/
extern BOOL dataPage_IsOpen( /* Out: !=0 si fen ouverte */
DATAPAGE * pDataPage); /* In: Datapage concerne */
extern void dataPage_setOpenBit(
DATAPAGE * pDataPage, /* In: Datapage concerne */
BOOL b_open ); /* In: !=0 si fen ouverte */
/*
* PUBlic INTernal prototypes:
*/
static int get_workYBas( /* Out: Coord Y Basse */
WIPARAMS * pWiParams ); /* In: Fentre concerne */
static int get_workXDroit( /* Out: Coord X droite */
WIPARAMS * pWiParams ); /* In: Fentre concerne */
static void add_wipar_ontop( WIPARAMS * *list_adr, WIPARAMS *pWiParams );
static WIPARAMS *take_off_wi_par( WIPARAMS * *list_adr, int wi_handle);
static void put_wi_on_top( WIPARAMS *pWiParams );
static void set_infoline( WIPARAMS *pWiParams, char *(*infoline_text) (WIPARAMS *pWiParams) );
static void update_VertSizePos(
WIPARAMS * pWiParams );
static void update_HorSizePos(
WIPARAMS * pWiParams );
static void set_slider_x( WIPARAMS *pWiParams );
static void set_slider_y( WIPARAMS *pWiParams );
static void set_slider_w( WIPARAMS *pWiParams );
static void set_slider_h( WIPARAMS *pWiParams );
static WIPARAMS * findWin_byDataPage( /* Out: Ptr sur fentre trouve ou NULL */
DATAPAGE * pDataPage, /* In: Ptr sur datapage dont on recherche la fentre ouverte */
WIPARAMS * pWiParams_list ); /* In: Ptr sur la liste des fentres */
/*
* PRIVate INTernal prototypes:
*/
static void menu_wi_options( void );
/*
* ------------------------ VARIABLES -------------------------
*/
/*
* External variables:
*/
/*
* Gnral:
*/
extern int G_ap_id; /* Identification par l'AES */
extern int G_x_mini, G_y_mini; /* Coord sup gauche de l'cran */
extern int G_w_maxi, G_h_maxi; /* Taille de l'cran de travail */
extern WIPARAMS *G_wi_list_adr; /* Adresse de l'arbre de paramtres */
WIPARAMS *G_closed_list_adr; /* Adresse de la liste de fen refermes */
extern int G_top_wi_handle; /* Fentre gre par le programme */
extern WIPARAMS *G_selection_adr; /* Paramtres de la "Fentre" dans laquelle
se trouve la slection actuelle */
extern char *G_empty_string; /* Chaine vide! */
/*
* VDI:
*/
extern int G_ws_handle; /* handle virtual workstation VDI */
extern int G_pxyarray[18]; /* Liste de coord X,Y pour le VDI */
extern int G_pxyarray2[10]; /* 2me liste */
extern MFDB G_plogMFDB; /* block cran logique */
extern VDI_TEXT_PARAMS G_std_text; /* Paramtres du texte standard */
extern int G_cell_size_prop; /* Rapport Hauteur/Largeur d'un emplacement caractre standard */
/*
* Ressources:
*/
extern OBJECT *G_menu_adr; /* Pointeur sur le MENU ! */
/*
* Debug:
*/
extern WIPARAMS *G_debug_window; /* Fentre de dbugging */
/*
* -------------------- METHODES POUR WIPARAMS --------------------------
*/
/*
* get_workYBas(-)
*
* Purpose:
* --------
* Retourne la coordonne Y du bord infrieur de la zone
* de travail d'une fentre
*
* Algorythm:
* ----------
* .. = coord bord sup + hauteur - 1
*
* History:
* --------
* 17.06.94: fplanque: Created
*/
int get_workYBas( /* Out: Coord Y basse */
WIPARAMS * pWiParams ) /* In: Fentre concerne */
{
return ( pWiParams -> work_y + pWiParams -> seen_h -1 );
}
/*
* get_workXDroit(-)
*
* Purpose:
* --------
* Retourne la coordonne X du bord droit de la zone
* de travail d'une fentre
*
* Algorythm:
* ----------
* .. = coord bord gauche + largeur - 1
*
* History:
* --------
* 17.06.94: fplanque: Created
*/
int get_workXDroit( /* Out: Coord X droite */
WIPARAMS * pWiParams ) /* In: Fentre concerne */
{
return ( pWiParams -> work_x + pWiParams -> seen_w -1 );
}
/*
* vscroll_window(-)
*
* Purpose:
* --------
* Scrolling vertical du contenu d'une fentre
*
* Algorythm:
* ----------
* Pour certains types de fentres, un scroll n'est pas rentable!
* Par exemple, lorsque l'on dj une image BITMAP du contenu
* en mmoire, dans cas on va faire un redraw standard:
*
* History:
* --------
* 1993: fplanque: Created
* 17.06.94: teste 'OVERLAPPED' plutt que WF_TOP
*/
void vscroll_window(
WIPARAMS *pWiParams,
unsigned long old_pos,
unsigned long new_pos )
{
switch( pWiParams -> type )
{
case TYP_EMPTY: /* Fentre vide: */
case TYP_PI3: /* Image: */
redraw( pWiParams, G_x_mini, G_y_mini, G_w_maxi, G_h_maxi, TAKE_CTRL ); /* Redraw complet */
break;
default: /* Autres types: */
{ /*
* Un scroll a ttes les chances de se rentabiliser:
*
* Bloque cran:
*/
if( start_WINDRAW( pWiParams ) == FALSE0 )
{ /*
* La fentre est overlappe:
* impossible de scroller:
*
* Effectue un redraw bourrin de la partie "on-screen"
* de la fentre, l'envoi de messages provoquant un
* dbordement tampon AES (=>plantage!) lorsqu'on se sert
* d'un ARROWED en continu:
*
* Par ailleurs, certaines procdures peuvent vouloir
* un redraw immdiat:
*/
redraw( pWiParams, G_x_mini, G_y_mini, G_w_maxi, G_h_maxi, CTRL_OK ); /* Redraw complet */
}
else
{ /*
* Si la fentre est au top: on va la faire scroller:
*/
/* Variables: */
unsigned long deplacement = labs( new_pos - old_pos );
int bloc_size;
/* Coordonnes de la zone de travail: */
int szone_x = pWiParams -> work_x;
int szone_y = pWiParams -> work_y;
int szone_w = pWiParams -> seen_w;
int szone_h = pWiParams -> seen_h;
/* Rduit la partie qui se trouve vraiment sur l'cran: */
rcintersect( G_x_mini, G_y_mini, G_w_maxi, G_h_maxi,
&szone_x, &szone_y, &szone_w, &szone_h );
/*
* Teste s'il y a une partie de l'cran scroller ou non:
*/
if( deplacement < szone_h )
{ /*
* S'il y a qque chose scroller:
*/
/* Taille du bloc dplacer: */
bloc_size = (int) (szone_h - deplacement);
graf_mouse( M_OFF, NULL); /* Efface le ptr souris */
/*
* Teste sens du dplacement
*/
if ( new_pos > old_pos )
{ /* On est descendu: */
/* Coordonnes source, destination: */
G_pxyarray[0]=szone_x; /* Coord source */
G_pxyarray[1]=szone_y + (int)deplacement;
G_pxyarray[2]=szone_x + szone_w -1;
G_pxyarray[3]=G_pxyarray[1] + bloc_size -1;
G_pxyarray[4]=szone_x; /* Coord destination */
G_pxyarray[5]=szone_y;
G_pxyarray[6]=G_pxyarray[2];
G_pxyarray[7]=szone_y + bloc_size -1;
/* Dplacement d'un bloc vers le haut sur l'cran logique: */
vro_cpyfm( G_ws_handle, S_ONLY, G_pxyarray,
&G_plogMFDB, &G_plogMFDB);
/* Fixe coord de ce qu'il reste dessiner: */
szone_y += bloc_size;
szone_h = (int)deplacement;
}
else if ( new_pos < old_pos )
{ /* On a mont: */
/* Coordonnes source, destination: */
G_pxyarray[0]=szone_x; /* Coord source */
G_pxyarray[1]=szone_y;
G_pxyarray[2]=szone_x + szone_w -1;
G_pxyarray[3]=szone_y + bloc_size -1;
G_pxyarray[4]=szone_x; /* Coord destination */
G_pxyarray[5]=szone_y + (int)deplacement;
G_pxyarray[6]=G_pxyarray[2];
G_pxyarray[7]=G_pxyarray[5] + bloc_size -1;
/* Dplacement d'un bloc vers le bas sur l'cran logique: */
vro_cpyfm( G_ws_handle, S_ONLY, G_pxyarray,
&G_plogMFDB, &G_plogMFDB);
/* Fixe coord de ce qu'il reste dessiner: */
szone_h = (int)deplacement;
}
else
{ /* Pas de dplacement: (ne devrait jamais se produire) */
/* Fixe coord de ce qu'il reste dessiner: */
szone_h = 0;
}
graf_mouse( M_ON, 0); /* Affiche le ptr souris */
}
/*
* Effectue un redraw de la partie d'cran qui n'a pas pu tre
* traite par scrolling:
*/
redraw( pWiParams, szone_x, szone_y, szone_w, szone_h, CTRL_OK );
}
/*
* rend le contrle de l'cran:
*/
end_WINDRAW();
}
}
}
/*
* hscroll_window(-)
*
* Purpose:
* --------
* Scrolling horizontal du contenu d'une fentre
*
* Algorythm:
* ----------
* Pour certains types de fentres, un scroll n'est pas rentable!
* Par exemple, lorsque l'on dj une image BITMAP du contenu
* en mmoire, dans cas on va faire un redraw standard:
*
* History:
* --------
* 1993: fplanque: Created
* 17.06.94: teste 'OVERLAPPED' plutt que WF_TOP
*/
void hscroll_window(
WIPARAMS *pWiParams,
unsigned long old_pos,
unsigned long new_pos )
{
switch( pWiParams -> type )
{
case TYP_EMPTY: /* Fentre vide: */
case TYP_PI3: /* Image: */
redraw( pWiParams, G_x_mini, G_y_mini, G_w_maxi, G_h_maxi, TAKE_CTRL ); /* Redraw complet */
break;
default: /* Autres types: */
{ /*
* Un scroll a ttes les chances de se rentabiliser:
*
* Bloque cran:
*/
if( start_WINDRAW( pWiParams) == FALSE0 )
{ /*
* La fentre est overlappe:
* impossible de scroller:
*/
/* Effectue un redraw bourrin de la partie "on-screen"
de la fentre, l'envoi de messages provoquant un
dbordement tampon AES (=>plantage!) lorsqu'on se sert
d'un ARROWED en continu: */
/* Par ailleurs, certaines procdures peuvent vouloir un redraw immdiat: */
redraw( pWiParams, G_x_mini, G_y_mini, G_w_maxi, G_h_maxi, CTRL_OK ); /* Redraw complet */
}
else
{ /* Si la fentre est au top: on va la faire scroller: */
/* Variables: */
unsigned long deplacement = labs( new_pos - old_pos );
int bloc_size;
/* Coordonnes de la zone de travail: */
int szone_x = pWiParams -> work_x;
int szone_y = pWiParams -> work_y;
int szone_w = pWiParams -> seen_w;
int szone_h = pWiParams -> seen_h;
/* Rduit la partie qui se trouve vraiment sur l'cran: */
rcintersect( G_x_mini, G_y_mini, G_w_maxi, G_h_maxi,
&szone_x, &szone_y, &szone_w, &szone_h );
/* Teste s'il y a une partie de l'cran scroller ou non: */
if( deplacement < szone_w )
{ /* S'il y a qque chose scroller: */
/* Taille du bloc dplacer: */
bloc_size = (int) (szone_w - deplacement);
graf_mouse( M_OFF, NULL); /* Efface le ptr souris */
/* Teste sens du dplacement */
if ( new_pos > old_pos )
{ /* On vavers la droite: */
/* Coordonnes source, destination: */
G_pxyarray[0]=szone_x + (int)deplacement; /* Coord source */
G_pxyarray[1]=szone_y;
G_pxyarray[2]=G_pxyarray[0] + bloc_size -1;
G_pxyarray[3]=szone_y + szone_h -1;
G_pxyarray[4]=szone_x; /* Coord destination */
G_pxyarray[5]=szone_y;
G_pxyarray[6]=szone_x + bloc_size -1;
G_pxyarray[7]=G_pxyarray[3];
/* Dplacement d'un bloc vers la gauche sur l'cran logique: */
vro_cpyfm( G_ws_handle, S_ONLY, G_pxyarray,
&G_plogMFDB, &G_plogMFDB);
/* Fixe coord de ce qu'il reste dessiner: */
szone_x += bloc_size;
szone_w = (int)deplacement;
}
else if ( new_pos < old_pos )
{ /* On va vers la gauche: */
/* Coordonnes source, destination: */
G_pxyarray[0]=szone_x; /* Coord source */
G_pxyarray[1]=szone_y;
G_pxyarray[2]=szone_x + bloc_size -1;
G_pxyarray[3]=szone_y + szone_h -1;
G_pxyarray[4]=szone_x + (int)deplacement; /* Coord destination */
G_pxyarray[5]=szone_y;
G_pxyarray[6]=G_pxyarray[4] + bloc_size -1;
G_pxyarray[7]=G_pxyarray[3];
/* Dplacement d'un bloc vers la droite sur l'cran logique: */
vro_cpyfm( G_ws_handle, S_ONLY, G_pxyarray,
&G_plogMFDB, &G_plogMFDB);
/* Fixe coord de ce qu'il reste dessiner: */
szone_w = (int)deplacement;
}
else
{ /* Pas de dplacement: (ne devrait jamais se produire) */
/* Fixe coord de ce qu'il reste dessiner: */
szone_w = 0;
}
graf_mouse( M_ON, 0); /* Affiche le ptr souris */
}
/* Effectue un redraw de la partie d'cran qui n'a pas pu tre
traite par scrolling: */
redraw( pWiParams, szone_x, szone_y, szone_w, szone_h, CTRL_OK );
}
/*
* rend le contrle de l'cran:
*/
end_WINDRAW();
}
}
}
/*
* wi_resize(-)
*
* Purpose:
* --------
* Changement de taille d'une fentre
*
* History:
* --------
* 1993: fplanque: Created
* 13.06.94: le repositionnement et le redimensionnement des ascenseurs a t extrait
*/
void wi_resize( WIPARAMS * pWiParams )
{
/*
* Nouvelle taille de la zone de travail:
*/
wind_get( pWiParams -> handle, WF_WORKXYWH,
&(pWiParams -> work_x), &(pWiParams -> work_y),
&(pWiParams -> seen_w), &(pWiParams -> seen_h) );
/*
* Repositionnement et Redimensionnement Vertical:
*/
update_VertSizePos( pWiParams );
/*
* Repositionnement et Redimensionnement Horizontal:
*/
update_HorSizePos( pWiParams );
}
/*
* update_VertSizePos(-)
*
* Purpose:
* --------
* Mise jour taille et position ascenseur vertical
* avec contrle de dbordement.
* repositionne le contenu de la fentre si traitement spcial est ncessaire
* appell par wi_resize()
*
* History:
* --------
* 13.06.94: fplanque: Extracted from wi_resize()
* 29.07.94: fplanque: Correction bug ds repositionnement: enlev get_workYBas( pWiParams )
* 25.09.94: prise en compte des TYP_ERRORS
*/
void update_VertSizePos(
WIPARAMS * pWiParams )
{
unsigned long new_pos;
set_slider_h( pWiParams ); /* Fix taille slider vertical */
if ( ( pWiParams -> seen_y + pWiParams -> seen_h /*-1*/ ) > pWiParams -> total_h )
{ /*
* Si on dpasse la fin du document:
*/
if( (pWiParams -> total_h) > (pWiParams -> seen_h) )
{ /*
* Si la fentre ne montre pas pour autant
* l'ENSEMBLE du document
*/
new_pos = pWiParams->total_h - pWiParams -> seen_h;
}
else
{ /*
* Si fentre est devenue plus grande que document,
* peut arriver avec TYP_DIR par ex...
*/
new_pos = 0;
}
/*
* Repositionne les donnes pour qu'elles tiennent compte du
* rajustement.
*/
switch( pWiParams -> type )
{
case TYP_TEXT:
case TYP_DEBUG:
case TYP_TRACK:
case TYP_ERRORS:
vmove_text( pWiParams, new_pos );
break;
case TYP_DIR:
(pWiParams -> draw_ptr.tree) -> ob_y +=
(int) (pWiParams -> seen_y - new_pos );
break;
}
pWiParams->seen_y = new_pos; /* Fixe nouvelle position */
}
set_slider_y( pWiParams ); /* Fixe position asc */
}
/*
* update_HorSizePos(-)
*
* Purpose:
* --------
* Mise jour taille et position ascenseur horizontal
* avec contrle de dbordement.
* appell par wi_resize()
*
* History:
* --------
* 13.06.94: fplanque: Extracted from wi_resize()
* 29.07.94: fplanque: Correction bug ds repositionnement
*/
void update_HorSizePos(
WIPARAMS * pWiParams )
{
unsigned long new_pos;
set_slider_w( pWiParams ); /* Fix taille slider horizontal */
if ( ( pWiParams -> seen_x + pWiParams -> seen_w /*-1*/ ) > pWiParams -> total_w )
{ /*
* Si on dpasse la fin du document:
*/
if( pWiParams->total_w > pWiParams -> seen_w )
{
new_pos= pWiParams->total_w - pWiParams -> seen_w;
}
else
{ /*
* Si fentre plus grande que document, peut arriver avec TYP_DIR par ex...
*/
new_pos = 0;
}
pWiParams ->seen_x = new_pos; /* Fixe nouvelle position */
}
set_slider_x( pWiParams ); /* Fixe position asc */
}
/*
* ouvre_fenetre(-)
*
* Purpose:
* --------
* Ouverture d'une fentre
*
* Algorythm:
* ----------
* - Vrifie si fen dj ouverte ou contenu lock (ACCESS)
* - Fixe elements de la fenetre ainsi que taille plein cran etc...
* - ...et demande l'AES de crer la fentre avec ces infos
* - chargement/cration du contenu
* - Allocation d'une zone WIPARAMS
* - Fixe paramtres dans cette zone, y compris taille l'ouverture
* - appelle ouvre_xxx() pour les dispositions d'affichages (remplissage formulaires etc...)
* - Cre titre, infos
* - Ouverture effective: affichage a l'cran (AES)
*
* History:
* --------
* 1993: fplanque: Created
* 17.05.94: Ajout de commentaires
* 06.08.94: Contrle qu'une seule fenetre max puisse etre ouverte sur une DATAPAGE donne
* 25.09.94: ouverture des TYP_ERRORS
* 11.10.94: empche temporairement l'ouverture de plusieurs fentres arbo
* 14.12.94: cration Titre/path des datapages ouvertes en fenetres
* 26.12.94: fixe positions des ascenseurs l'ouverture
*/
WIPARAMS * ouvre_fenetre(
int class,
int type,
DATAGROUP * datagroup,
DATADIR * datadir,
DATAPAGE * datapage,
const char * titre )
{
static int default_x=0,
default_y=0; /* Coordonnes d'ouverture par defaut */
WIPARAMS * pWiParams; /* Adresse des params */
int wi_handle; /* handle de la fen qu'on va crer */
int wi_ckind=COMPLETE; /* Elments de la fentre */
int x_full, y_full, w_full, h_full;
int x_work, y_work, w_work, h_work;
int access_ok = 1; /* A priori l'accs aux donnes de la fentre ouvrir n'est pas bloqu */
WORK_CONTENT pointeur; /* Pointeur sur le contenu de la fentre */
WORK_DRAW draw_ptr; /* Pointeur sur infos de dessin associes! */
int ouverture_ok; /* =0 si ouverture foir */
char * pMsz_CreatedTitle = NULL;
/*
* On commence par vrifier que la fentre qui nous intresse n'est
* pas dj ouverte ou encore que son contenu n'est pas bloqu:
*/
if( type == TYP_TREE )
{
if( datagroup -> root_dir != NULL && datagroup -> root_dir -> nb_dirs > 0 )
{
form_alert( 1, "[3][|Vous ne pouvez pas ouvrir|"
"plusieurs fentres sur|"
"l'arborescence]"
"[Abandon]" );
return NULL;
}
}
else if( class == CLASS_DATAPAGE )
{
if ( dataPage_IsOpen( datapage ) )
{ /*
* S'il y a dj une fentre ouverte sur cette DATAPAGE:
* Trouve cette fentre:
*/
WIPARAMS * wi_adr = findWin_byDataPage( datapage, G_wi_list_adr );
/*
* on va la monter au 1er Plan:
*/
if ( wi_adr != NULL )
{
put_wi_on_top( wi_adr );
}
else
{ /* ANORMAL */
signale( "Impossible de trouver la fentre ouverte sur cet objet" );
}
return NULL; /* Pas de fentre ouverte */
}
switch( type )
{
case TYP_TEXT:
/* Si texte */
access_ok= access_text( datapage, &pointeur, &( draw_ptr.pTextDrawPar ) );
break;
case TYP_PI3:
/* Si image degas */
access_ok= access_image( datapage, &pointeur, &draw_ptr );
break;
case TYP_ARBO:
/* Si sommaire d'dition ARBO */
access_ok= access_arbo( datapage, &pointeur );
break;
default:
access_ok= 0; /* Accs impossible! */
signale("Type DATAPAGE inconnu => autorisation d'accs non dtermine");
}
if( access_ok == 0 )
{ /*
* Si ouverture impossible:
*/
return NULL;
}
/*
* Signale l'ouverture d'une fentre sur la DATAPAGE:
* On ne peut en ouvrir qu'une page DATAPAGE:
*/
dataPage_setOpenBit( datapage, TRUE_1 );
datadir -> nb_edits ++; /* Une fen d'dition d'ouverte de plus dans ce groupe */
}
/*
* Si on a pu accder:
*
* Calcul des coordonnes "plein cran" de la fentre
* Et fixe elts de la fentre (Par dfaut elle est dj COMPLETE):
* Et teste si le document a le droit d'tre ouvert:
*/
switch ( type )
{
case TYP_PI3:
pi3_optimal( wi_ckind, &x_full, &y_full, &w_full, &h_full);
break;
case TYP_TREE:
arbotree_optimal( wi_ckind, datadir, &x_full, &y_full, &w_full, &h_full);
break;
case TYP_ARBO:
wi_ckind &= ~INFO; /* Cette fenetre n'aura pas de ligne d'infos */
arboedit_optimal( wi_ckind, &x_full, &y_full, &w_full, &h_full);
y_full = G_y_mini + ( G_h_maxi - h_full )/2;
break;
case TYP_DIR:
dir_optimal( &x_full, &y_full, &w_full, &h_full);
break;
case TYP_TEXT:
case TYP_DEBUG:
case TYP_ERRORS:
text_optimal( wi_ckind, &x_full, &y_full, &w_full, &h_full);
break;
case TYP_TRACK:
wi_ckind = NAME|CLOSER|FULLER|MOVER|INFO|SIZER;
text_optimal( wi_ckind, &x_full, &y_full, &w_full, &h_full);
break;
default:
x_full = G_x_mini;
y_full = G_y_mini;
w_full = G_w_maxi;
h_full = G_h_maxi;
break;
}
/*
* Demande l'AES de Crer la fentre:
*/
wi_handle=wind_create(wi_ckind, x_full, y_full, w_full, h_full);
if ( wi_handle <= 0)
{
alert( NOMORE_WIN ); /* Plus de fentre dispo */
}
else
{
/*
* Chargement/Cration du contenu:
*/
switch( class )
{
case CLASS_DATAPAGE:
/*
* Rcupre chemin d'accs l'objet en RAM
* pour en faire le titre de la fentre:
*/
pMsz_CreatedTitle = page_fullpath( datadir, datapage -> nom );
ouverture_ok=1;
break;
default:
switch( type )
{
case TYP_EMPTY:
case TYP_TREE: /* Si Arborescence */
case TYP_DIR: /* Si liste des pages cran */
ouverture_ok=1;
break;
case TYP_TEXT:
ouverture_ok= charge_texte( &( draw_ptr.pTextDrawPar ) );
break;
case TYP_DEBUG:
ouverture_ok= debug_CreateWinText( &( draw_ptr.pTextDrawPar ) );
break;
case TYP_ERRORS:
ouverture_ok= errors_CreateWinText( &( draw_ptr.pTextDrawPar ) );
break;
case TYP_TRACK:
{ /*
* Tracking d'une voie:
*/
TEXTINFO * pTextInfo = create_TextInfo();
ouverture_ok = 0;
if( pTextInfo != NULL )
{
TEXT_DRAWPAR * pTextDrawPar = create_TextDrawPar( pTextInfo, 100 );
if( pTextDrawPar != NULL )
{
draw_ptr.pTextDrawPar = pTextDrawPar;
ouverture_ok= 1;
}
else
{
free_formatext( pTextInfo );
}
}
}
break;
default:
signale("Type de donnes inconnu, impossible d'y accder");
}
}
if ( ouverture_ok == 1)
{ /*
* Si on a pu ouvrir le contenu:
*
* Rserve/Rcupre une zone de params
*/
if ( G_closed_list_adr == NULL)
{ /*
* Si pas de fentres fermes prtes a tre rouvertes
*/
pWiParams= (WIPARAMS *)MALLOC( sizeof(WIPARAMS) ) ;
/* Cration d'un zone de paramtres */
if (pWiParams == NULL)
{
alert( NOMEM_OPENWIN ); /* Pas assez de mem pour ouvrir fen */
free_String( pMsz_CreatedTitle );
wind_delete( wi_handle ); /* Libre mmoire fentre */
wi_handle = 0; /* Echec d'ouverture */
}
else
{
if
(
default_x == 0 /* Non initialis */
|| default_x > (G_x_mini+G_w_maxi)/2 /* Trop loin dans l'cran */
|| default_y > (G_y_mini+G_h_maxi)/2
)
{ /* (R)-Initialisation des coordonnes par defaut */
default_x = G_x_mini + G_std_text. cell_w;
default_y = G_y_mini + G_std_text. cell_h * 0.3;
}
pWiParams -> curr_x = default_x;
pWiParams -> curr_y = default_y;
pWiParams -> curr_w = G_w_maxi/1.5;
pWiParams -> curr_h = G_h_maxi/1.5;
/* Pour la prochaine fentre: */
default_x += G_std_text. cell_w * G_cell_size_prop;
default_y += G_std_text. cell_h * 1.3;
}
}
else
{ /*
* Si on peut rcuprer les parms d'une ancienne fentre
*/
pWiParams= take_off_wi_par( &G_closed_list_adr, 0);
}
/*
* Calcule la taille UTILE (de la zone de TRAVAIL) de la fentre:
*/
wind_calc( WC_WORK, wi_ckind, pWiParams -> curr_x, pWiParams -> curr_y,
pWiParams -> curr_w, pWiParams -> curr_h,
&x_work, &y_work, &w_work, &h_work );
/*
* Ouverture...
*/
if ( wi_handle !=0 ) /* Si on a pu ouvrir une fentre*/
{
/*
* Fixe paramtres complmentaires:
*/
pWiParams -> handle = wi_handle;
pWiParams -> class = class; /* Classe de contenu */
pWiParams -> datagroup = datagroup; /* Datagroup concern */
pWiParams -> datadir = datadir; /* Dossier concern */
pWiParams -> datapage = datapage; /* Page concerne */
pWiParams -> type = type; /* Type de contenu */
/*
* Coords de la zone de travail actuelle:
*/
pWiParams -> work_x = x_work;
pWiParams -> work_y = y_work;
/*
* Coordonnes (par dfaut) de la fentre ouverte sur le document:
*/
pWiParams -> seen_x = 0; /* Offset X */
pWiParams -> seen_y = 0; /* Offset Y */
/*
* Taille actuellement affiche:
*/
pWiParams -> seen_w = w_work; /* Largeur */
pWiParams -> seen_h = h_work; /* Hauteur */
/*
* Initialisations:
*/
pWiParams -> wi_ckind = wi_ckind; /* Elts actifs */
pWiParams -> fulled = 0; /* Taille normale */
pWiParams -> selected_icon = 0; /* Icne slectionne */
/*
* Par dfaut: Pas d'Options menu
*/
pWiParams -> menu_options.save = FALSE0;
pWiParams -> menu_options.saveas = FALSE0;
pWiParams -> menu_options.savedisk = FALSE0;
pWiParams -> menu_options.newlink = FALSE0;
pWiParams -> menu_options.newpage = FALSE0;
pWiParams -> menu_options.newrub = FALSE0;
pWiParams -> menu_options.newtext = FALSE0;
pWiParams -> menu_options.compile = FALSE0;
pWiParams -> menu_options.affichage = PARAFF_NONE;
/*
* Etats par dfaut:
*/
pWiParams -> WinFlags .b_modified = FALSE0; /* Contenu de la fentre pas modifi */
switch ( type )
{
case TYP_PI3: /* Degas haute rsolution */
open_pi3( pWiParams, pointeur.datapage, draw_ptr.psrcMFDB );
break;
case TYP_ARBO: /* Si sommaire d'dition ARBO */
open_arbosomm( pWiParams, pointeur.datapage );
break;
case TYP_TREE: /* Si ARBOrescence */
open_arbotree( pWiParams );
break;
case TYP_DIR:
open_dir( pWiParams, datadir, x_work, y_work, w_work );
break;
case TYP_TEXT:
case TYP_DEBUG:
case TYP_TRACK:
open_text( pWiParams, draw_ptr.pTextDrawPar );
if( class == CLASS_DATAPAGE )
{ /*
* S'il s'agit d'un texte en ram:
* on peut le sauver en ram...
*/
pWiParams -> menu_options.save = TRUE_1;
}
break;
case TYP_ERRORS:
errors_OpenLogWin( pWiParams, draw_ptr.pTextDrawPar );
break;
default:
pWiParams -> content_ptr.x= NULL; /* Pas de contenu */
pWiParams -> draw_ptr.x = NULL; /* Pas de contenu */
pWiParams -> total_w = 1; /* Taille totale (minimum) */
pWiParams -> total_h = 1;
pWiParams -> h_step = G_std_text .cell_w * G_cell_size_prop; /* Saut par 8 car */
pWiParams -> v_step = G_std_text .cell_h; /* Saut par ligne */
}
/*
* Calcule taille maximale que l'user pourra donner la fentre:
*/
switch( type )
{
case TYP_EMPTY:
case TYP_DIR:
pWiParams -> maxsize_w = G_w_maxi;
pWiParams -> maxsize_h = G_h_maxi;
break;
case TYP_TEXT:
case TYP_DEBUG:
case TYP_TRACK:
case TYP_ERRORS:
{
int foo;
wind_calc( WC_BORDER, wi_ckind, 100, 100,
(int) pWiParams -> total_w, G_h_maxi, &foo, &foo,
&(pWiParams -> maxsize_w), &(pWiParams -> maxsize_h) );
break;
}
default:
{
int foo;
/*
* Calcule les coordonnes totales de la fentre,
* en fonction de la taille du documenent
* Peut tre plus grand que l'cran physique,
* c'est la diffrence avec w_full et h_full
* qui sont <= G_w_maxi et G_h_maxi...
*/
wind_calc( WC_BORDER, wi_ckind, 100, 100,
(int) pWiParams -> total_w, (int) pWiParams -> total_h, &foo, &foo,
&(pWiParams -> maxsize_w), &(pWiParams -> maxsize_h) );
}
}
/*
* Cre le titre
*/
if( pMsz_CreatedTitle == NULL )
{
pWiParams -> name_adr = STRDUP( titre ); /* Duplique titre fourni */
}
else
{
pWiParams -> name_adr = pMsz_CreatedTitle;
}
wind_set( wi_handle, WF_NAME, pWiParams -> name_adr );
/*
* Cre les infos
*/
pWiParams -> info_adr = G_empty_string; /* Par dfaut: */
switch( class )
{
case CLASS_EMPTY:
pWiParams -> info_adr = STRDUP(" Fenetre vide");
wind_set( wi_handle, WF_INFO, pWiParams -> info_adr );
break;
case CLASS_DIR: /* Directory */
set_infoline( pWiParams, dir_infoline ); /* Modifie ligne d'infos */
break;
case CLASS_TREE: /* Arborescence */
set_infoline( pWiParams, arbo_infoline ); /* Modifie ligne d'infos */
break;
case CLASS_DATAPAGE:
default:
wind_set( wi_handle, WF_INFO, pWiParams -> info_adr );
}
/*
* Fixe tailles des ascenseurs:
*/
set_slider_w( pWiParams ); /* Fix taille slider horizontal */
set_slider_h( pWiParams ); /* Fix taille slider vertical */
/*
* Fixe positions des ascenseurs:
*/
set_slider_x( pWiParams );
set_slider_y( pWiParams );
/*
* Contrle de la taille d'ouverture:
*/
if ( pWiParams -> curr_w > w_full )
{
pWiParams -> curr_w = w_full;
}
if ( pWiParams -> curr_h > h_full )
{
pWiParams -> curr_h = h_full;
}
/*
* Affiche fentre
*/
add_wipar_ontop( &G_wi_list_adr, pWiParams);
/* Ajoute nlle fen en tte de liste */
G_top_wi_handle=G_wi_list_adr -> handle; /* Fentre la plus en haut */
wind_open( wi_handle,
pWiParams -> curr_x, pWiParams -> curr_y,
pWiParams -> curr_w, pWiParams -> curr_h);
/*
* Options menu:
*/
menu_ienable( G_menu_adr, FERMER, 1); /* Enable Fermer */
if ( pWiParams -> next != NULL )
{ /*
* S'il y a maintenant au moins 2 fentres ouvertes
*/
menu_ienable( G_menu_adr, PREMPLAN, 1); /* Enable Premier Plan */
}
/*
* Autres options:
*/
menu_wi_options();
/*
* Retourne adresse params fenetre:
*/
return pWiParams;
}
}
else /* Si on a pas pu ouvrir le contenu */
{
wind_delete( wi_handle ); /* Libre mmoire fentre */
}
}
/*
* On a pas pu ouvrir de fentre:
*/
return NULL;
}
/*
* ferme_fenetre(-)
*
* Purpose:
* --------
* Fermeture d'une fenetre
*
* History:
* --------
* 1993: fplanque: Created
* 25.09.94: lorsqu'on ferme le debug, on garde le log text pour plus tard
* 25.09.94: gestion des fen type ERRORS
* 14.12.94: demande s'il faut sauver avant de fermer si le doc a t modifi
* 07.01.95: renvoie rsultat, prend param b_Query
*/
BOOL ferme_fenetre( /* Out: TRUE_1 si la fentre a t ferme */
WIPARAMS * pWiParams, /* In: fentre fermer */
BOOL b_Query ) /* In: TRUE_1 si on doit demander confirmation avant perte de donnes */
{
int closed_wi_handle;
if( pWiParams == NULL || G_top_wi_handle == 0 )
{ /*
* Si aucune fentre ouverte!
* Cela arrive lorsque le menu n'a pas eu le temps de s'effacer aprs
* fermeture de la dernire fen et que l'user t assez rapide pour
* y recliquer
*/
ping();
return FALSE0;
}
if( pWiParams -> WinFlags .b_modified && b_Query )
{ /*
* Si le contenu de la fentre a t modifi,
* Et si on est autoris demander:
* On va proposer de sauvegarder avant de fermer
*/
switch( alert( DLG_SAVEBEFORECLOSE ) )
{
case 1:
/*
* Il faut sauver:
*/
sauver_ram( pWiParams );
break;
case 3:
/*
* Il ne faut pas fermer:
*/
return FALSE0;
}
}
/*
* Si au moins une fentre ouverte:
* Handle de la fen fermer:
*/
closed_wi_handle = pWiParams -> handle;
/*
* Suppression dans la liste des paramtres:
*/
pWiParams = take_off_wi_par( &G_wi_list_adr, closed_wi_handle );
/*
* Mise jour des paramtres de la fentre:
*/
pWiParams -> handle =0; /* Cette fen n'aura plus de handle */
/*
* Ajout des paramtres sur la tte de liste des fen fermes
*/
add_wipar_ontop( &G_closed_list_adr, pWiParams);
/*
* Suppression de la fentre par le systme:
*/
wind_close( closed_wi_handle );
wind_delete( closed_wi_handle );
/*
* Supression des donnes en mmoire/signalisation fermeture:
*/
switch( pWiParams -> class )
{
case CLASS_DIR:
{ /*
* Efface arbre d'objets directory (& evtlmnt ICONBLKs )
*/
efface_dir( pWiParams );
break;
}
case CLASS_TREE:
{ /*
* Efface arbre d'objets arbo:
*/
efface_arbotree( pWiParams );
break;
}
case CLASS_TEXT:
switch( pWiParams -> type )
{
case TYP_DEBUG:
/*
* Si on a affaire la fentre d'infos debug
*/
G_debug_window = NULL; /* Plus de fentre de debug */
menu_ienable( G_menu_adr, SYSTEMST, 0); /* Disable System status */
/*
* On n'efface pas le log debug:
* On le garde pour la prochaine fois
*/
break;
case TYP_ERRORS:
/*
* Run-Time errors:
*/
errors_CloseLogWin( pWiParams );
break;
default:
/*
* Libre le texte formatt:
*/
free_formatext( pWiParams -> draw_ptr.pTextDrawPar -> pTextInfo );
}
/*
* Libre les infos d'affichage:
*/
FREE( pWiParams -> draw_ptr.pTextDrawPar );
break;
case CLASS_DATAPAGE:
{ /*
* La fentre contient l'dition d'une PAGE de donnes:
*/
switch( pWiParams -> type )
{
case TYP_TEXT:
/* Libre le texte formatt: */
free_formatext( pWiParams -> draw_ptr.pTextDrawPar -> pTextInfo );
/* Libre les infos d'affichage: */
FREE( pWiParams -> draw_ptr.pTextDrawPar );
break;
case TYP_PI3:
/* Libre zone MFDB: */
FREE( pWiParams -> draw_ptr.psrcMFDB );
break;
case TYP_ARBO:
/* Libre arbre d'objets: */
free_arbosomm( pWiParams -> draw_ptr.tree );
break;
default:
signale("Le contenu de la fentre n'a pas t libr");
}
/*
* Signale qu'il n'y a plus de fen ouverte sur ce doc
*/
dataPage_setOpenBit( pWiParams -> datapage, FALSE0 );
/*
* Signale une fen d'dition de - dans ce DATADIR:
*/
((pWiParams -> datadir) -> nb_edits) --;
/*
* Signale une fen d'dition de - dans ce DATAGROUP:
*/
/* utile uniqmt si dossiers imbriqus */
/* ((pWiParams -> datagroup) -> nb_edits) --; */
break;
}
default:
{
switch( pWiParams -> type )
{
case TYP_EMPTY:
break;
default:
signale("Le contenu de la fentre n'a pas t libr");
}
}
}
FREE( pWiParams -> name_adr ); /* Libre chaine Titre */
if ( pWiParams -> info_adr != G_empty_string )
{ /*
* S'il y a une ligne d'infos:
*/
FREE( pWiParams -> info_adr ); /* Libre chaine infos */
}
/*
* Traitement des consquences la fermeture
* au niveau gestion des fentres:
*/
if ( G_wi_list_adr == NULL ) /* Si plus aucune fentre ouvert */
{
G_top_wi_handle = 0; /* Plus de fentre suprieure! */
menu_ienable( G_menu_adr, FERMER, 0); /* Disable */
}
else
{
G_top_wi_handle = G_wi_list_adr -> handle;
/* Nlle fentre suprieure */
if ( G_wi_list_adr -> next == NULL )
{ /*
* S'il y a maintenant plus qu'une seule fen ouverte
*/
menu_ienable( G_menu_adr, PREMPLAN, 0); /* Disable Premier Plan */
}
}
if( G_selection_adr == pWiParams )
{ /*
* Si la slection actuelle se trouvait dans la fen ferme
*/
no_selection(); /* Efface les flags */
}
/*
* Options menu:
*/
menu_wi_options(); /* Chg options menu en fnct de la nlle fen au 1er plan */
return TRUE_1;
}
/*
* add_wipar_ontop(-)
*
* Purpose:
* --------
* Ajout d'une fenêtre dans une liste de fenêtres
*
* History:
* --------
* 1993: fplanque: Created
*/
void add_wipar_ontop( WIPARAMS * *list_adr, WIPARAMS *pWiParams )
{
pWiParams -> next = *list_adr; /* Pointe sur la suite */
*list_adr=pWiParams; /* Nlle tte de liste */
}
/*
* take_off_wi_par(-)
*
* Purpose:
* --------
* Retrait d'une fenetre d'une liste de fenetres
*
* History:
* --------
* 1993: fplanque: Created
*/
WIPARAMS *take_off_wi_par(
WIPARAMS * *list_adr,
int wi_handle)
{
WIPARAMS *pWiParams; /* Adresse des params de la fen fermer*/
WIPARAMS *prec_params_adr=NULL;
/* Adresse des params de la fen prcdente*/
pWiParams=*list_adr; /* On commence par le haut de la liste */
while ( (pWiParams -> handle) != wi_handle )
/* Tant qu'on pointe pas sur la fen qu'on veut fermer */
{
prec_params_adr = pWiParams; /* Nlle fen prcdente */
pWiParams = pWiParams -> next; /* Nlle fentre tester */
}
if ( prec_params_adr == NULL ) /* Si c'tait la tte de liste */
*list_adr = pWiParams -> next; /* Nlle tte de liste*/
else
prec_params_adr -> next = pWiParams -> next;
/* Court circuite la fentre effacer! */
return pWiParams;
/* Adresse de la zone de params qui a t retire */
}
/*
* set_infoline(-)
*
* Purpose:
* --------
* Modifie la ligne d'informations d'une fenetre
*
* History:
* --------
* 1993: fplanque: Created
* 10.09.94: use of free_String()
*/
void set_infoline(
WIPARAMS *pWiParams,
char *(*infoline_text) (WIPARAMS *pWiParams) )
{
char *old_info = pWiParams -> info_adr;
/*
* Fixe nouvelle chaine d'infos:
*/
pWiParams -> info_adr = infoline_text( pWiParams ); /* Cre une copie du tampon */
wind_set( pWiParams -> handle, WF_INFO, pWiParams -> info_adr );
/*
* Efface ancienne chaine:
*/
free_String( old_info );
}
/*
* fixform_window(-)
*
* Purpose:
* --------
* Fixe la position d'un formulaire contenu dans une fenetre
*
* History:
* --------
* 1993: fplanque: Created
*/
void fixform_window( WIPARAMS *pWiParams )
{
(pWiParams -> draw_ptr.tree) -> ob_x =
pWiParams -> work_x - (int) (pWiParams -> seen_x) + OUTLINE_INWIN;
(pWiParams -> draw_ptr.tree) -> ob_y =
pWiParams -> work_y - (int) (pWiParams -> seen_y) + OUTLINE_INWIN;
}
/*
* cycle_window(-)
*
* Purpose:
* --------
* Ramne la fentre du fond au 1er plan
*
* History:
* --------
* 1993: fplanque: Created
* 22.11.94: fplanque: teste si fen ouverte avant d'agir
*/
void cycle_window( void )
{
WIPARAMS *pWiParams = G_wi_list_adr; /* Adresse des params */
if ( pWiParams == NULL )
{
ping();
}
else
{ /*
* S'il y a des fentres ouvertes:
* Trouve fentre du fond
*/
while( pWiParams -> next != NULL )
{ /*
* Tant qu'on a pas trouv la dernire fentre:
*/
pWiParams = pWiParams -> next; /* Passe la suivante */
}
/* Ramne la dernire fentre au 1er plan: */
put_wi_on_top( pWiParams );
}
}
/*
* put_wi_on_top(-)
*
* Purpose:
* --------
* Place une fentre au premier plan
*
* History:
* --------
* 1993: fplanque: Created
*/
void put_wi_on_top( WIPARAMS *pWiParams )
{
int wi_handle = pWiParams -> handle;
wind_set( wi_handle, WF_TOP);
G_top_wi_handle=wi_handle; /* Nlle fentre au TOP */
take_off_wi_par( &G_wi_list_adr, wi_handle );
add_wipar_ontop( &G_wi_list_adr, pWiParams );
menu_wi_options(); /* Chg options menu en fnct de la nlle fen au 1er plan */
}
/*
* find_datawindow2(-)
*
* Purpose:
* --------
* Trouve une fentre appartenant un certain datagroup
*
* Algorythm:
* ----------
* La fentre qu'on recherche sera repre d'aprs l'adresse de
* son contenu, seul point de repre qui ne change pas lorsque
* l'on efface ou que l'on ajoute des lments dans un directory
* (ce qui n'est pas le cas du no d'objet, par exemple).
* On repre donc en gnral avec les adresses suivantes:
* OLD : adr_contenu= &(DATAGROUP)
* Directory : adr_contenu= &(DATADIR)
* Document : adr_contenu= &(DATAPAGE)
*
* History:
* --------
* 1993: fplanque: Created
*/
WIPARAMS *find_datawindow2(
unsigned long adr_contenu,
WIPARAMS *start )
{
/* printf("Seeking for %lu\n", adr_contenu ); */
while ( start != NULL )
{
/* printf("Found:%lu\n",start -> content_ptr.x); */
if ( (unsigned long) (start -> content_ptr.x) == adr_contenu )
{ /*
* Sort si on a trouv une fen correspondant au critre
*/
return start; /* Adr des params de la fen correspondante ou NULL */
}
start = start -> next;
}
/*
* On a pas trouv:
*/
return NULL;
}
/*
* findWin_byDataPage(-)
*
* Purpose:
* --------
* Trouve une fentre ouverte sur une certaine DATAPAGE
*
* Algorythm:
* ----------
* La fentre qu'on recherche sera repre d'aprs l'adresse de
* sa datapage
*
* History:
* --------
* 31.05.94: fplanque: Created base on fin_datawindow()
*/
WIPARAMS * findWin_byDataPage( /* Out: Ptr sur fentre trouve ou NULL */
DATAPAGE * pDataPage, /* In: Ptr sur datapage dont on recherche la fentre ouverte */
WIPARAMS * pWiParams_list ) /* In: Ptr sur la liste des fentres */
{
while ( pWiParams_list != NULL )
{
if ( pWiParams_list -> datapage == pDataPage )
{ /*
* Sort si on a trouv une fen correspondant au critre
*/
return pWiParams_list; /* Adr des params de la fen correspondante ou NULL */
}
pWiParams_list = pWiParams_list -> next;
}
/*
* On a pas trouv:
*/
return NULL;
}
/*
* ------------------- Taille/pos des Ascenseurs ------------------
*/
/*
* set_slider_w(-)
*
* Purpose:
* --------
* Fixe taille ascenseur horizontal
*
* History:
* --------
* 1993: fplanque: Created
*/
void set_slider_w( WIPARAMS *pWiParams )
{
if ( pWiParams -> wi_ckind & HSLIDE )
{ /* S'il y a un ascenseur horizontal: */
long taille; /* taille du slider */
taille= ( (pWiParams -> seen_w) * (long)1000 / (pWiParams -> total_w) );
/* Calcul fait en LONG */
if (taille>1000)
taille=1000;
wind_set( pWiParams -> handle, WF_HSLSIZE, (int)taille, 0, 0, 0);
/* Fixe taille */
}
}
/*
* set_slider_h(-)
*
* Purpose:
* --------
* Fixe taille ascenseur vertical
*
* History:
* --------
* 1993: fplanque: Created
*/
void set_slider_h( WIPARAMS *pWiParams )
{
if ( pWiParams -> wi_ckind & VSLIDE )
{ /* S'il y a un ascenseur vertical: */
long taille; /* taille du slider */
taille= ( (pWiParams -> seen_h) * (long)1000 / (pWiParams -> total_h) );
/* Calcul fait en LONG */
if (taille>1000)
taille=1000;
wind_set( pWiParams -> handle, WF_VSLSIZE, (int)taille, 0, 0, 0);
/* Fixe taille */
}
}
/*
* set_slider_y(-)
*
* Purpose:
* --------
* Fixe position ascenseur vertical
*
* History:
* --------
* 1993: fplanque: Created
*/
void set_slider_y(
WIPARAMS * pWiParams )
{
if ( pWiParams -> wi_ckind & VSLIDE )
{ /*
* S'il y a un ascenseur vertical:
*/
long position; /* position du slider */
if ( pWiParams -> seen_h >= pWiParams -> total_h )
{
position = 0;
}
else
{
position= 1000 * (pWiParams -> seen_y) /
(pWiParams -> total_h - pWiParams -> seen_h );
/* Calcul fait en LONG */
}
wind_set( pWiParams -> handle, WF_VSLIDE, (int)position );
/* Fixe position */
}
}
/*
* set_slider_x(-)
*
* Purpose:
* --------
* Fixe position ascenseur horizontal
*
* History:
* --------
* 1993: fplanque: Created
*/
void set_slider_x(
WIPARAMS *pWiParams )
{
if ( pWiParams -> wi_ckind & HSLIDE )
{ /*
* S'il y a un ascenseur horizontal:
*/
long position; /* position du slider */
if ( pWiParams -> seen_w >= pWiParams -> total_w )
{
position = 0;
}
else
{
position= 1000 * (pWiParams -> seen_x) /
(pWiParams -> total_w - pWiParams -> seen_w );
/* Calcul fait en LONG */
}
wind_set( pWiParams -> handle, WF_HSLIDE, (int)position );
/* Fixe position */
}
}
/*
* -------------------------------------------------------
*/
/*
* menu_wi_options(-)
*
* Purpose:
* --------
* Validation des options du menu concernant la fentre au top
*
* History:
* --------
* 1993: fplanque: Created
* 31.05.94: Ajout option 'Sauver'
* 18.06.94: options "new text" et "compile"
*/
void menu_wi_options( void )
{
if ( G_wi_list_adr != NULL ) /* S'il y a au - 1 fen ouverte: */
{
MENU_OPTIONS menu_options = G_wi_list_adr -> menu_options;
menu_ienable( G_menu_adr, SAUVER, menu_options.save? 1:0 );
menu_ienable( G_menu_adr, SAVEAS, menu_options.saveas? 1:0 );
menu_ienable( G_menu_adr, SAVEDISK, menu_options.savedisk? 1:0 );
menu_ienable( G_menu_adr, MENNEWLK, menu_options.newlink? 1:0 );
menu_ienable( G_menu_adr, MENNEWPG, menu_options.newpage? 1:0 );
menu_ienable( G_menu_adr, MENEWRUB, menu_options.newrub? 1:0 );
menu_ienable( G_menu_adr, MENEWTXT, menu_options.newtext? 1:0 );
menu_ienable( G_menu_adr, MENCOMPI, menu_options.compile? 1:0 );
menu_ienable( G_menu_adr, AFFICHAG, (menu_options.affichage != PARAFF_NONE) ? 1:0 );
}
else /* Si plus aucune fentre ouverte: */
{
menu_ienable( G_menu_adr, SAUVER, 0); /* Disable Sauver */
menu_ienable( G_menu_adr, SAVEAS, 0); /* Disable Sauver */
menu_ienable( G_menu_adr, SAVEDISK, 0); /* Disable Sauver */
menu_ienable( G_menu_adr, MENNEWLK, 0); /* Disable Nouveau Lien */
menu_ienable( G_menu_adr, MENEWRUB, 0); /* Disable Nouvelle rubrique */
menu_ienable( G_menu_adr, MENEWTXT, 0); /* Disable */
menu_ienable( G_menu_adr, MENCOMPI, 0); /* Disable */
menu_ienable( G_menu_adr, MENNEWPG, 0); /* Disable Nouvelle page */
menu_ienable( G_menu_adr, AFFICHAG, 0); /* Disable Affichage */
}
}
/*
* Wnd_SetModified(-)
*
* Purpose:
* --------
* Positionne le flag modified
* et traduit cet tat dans le titre de la fentre
*
* History:
* --------
* 14.12.94: fplanque: Created
*/
void Wnd_SetModified(
WIPARAMS * pWiParams ) /* In: Fentre concerne */
{
char * pMsz_NewTitle;
if( pWiParams -> WinFlags .b_modified == TRUE_1 )
{ /*
* On a dj modifi auparavent:
*/
return;
}
/*
* Contenu de la fentre a t modifi maintenant:
*/
pWiParams -> WinFlags .b_modified = TRUE_1;
/*
* Nouveau titre:
* On augmente la longueur de 2 "* " et on oublie pas la place pour le 0 final
*/
pMsz_NewTitle = MALLOC( strlen( pWiParams -> name_adr ) + 3 );
pMsz_NewTitle[0] = '*';
pMsz_NewTitle[1] = ' ';
strcpy( &pMsz_NewTitle[2], pWiParams -> name_adr );
Wnd_ChangeTitle( pWiParams, pMsz_NewTitle );
}
/*
* Wnd_ClearModified(-)
*
* Purpose:
* --------
* Enlve le flag modified
* et traduit cet tat dans le titre de la fentre
*
* History:
* --------
* 14.12.94: fplanque: Created
*/
void Wnd_ClearModified(
WIPARAMS * pWiParams ) /* In: Fentre concerne */
{
char * pMsz_NewTitle;
if( pWiParams -> WinFlags .b_modified == FALSE0 )
{ /*
* La fentre n'tait pas modifie:
*/
return;
}
/*
* Contenu de la fentre a t sauv maintenant:
*/
pWiParams -> WinFlags .b_modified = FALSE0;
/*
* Nouveau titre (le mme sans "* " au dbut)
*/
pMsz_NewTitle = STRDUP( &(pWiParams -> name_adr)[2] );
Wnd_ChangeTitle( pWiParams, pMsz_NewTitle );
}
/*
* Wnd_ChangeTitle(-)
*
* Purpose:
* --------
* Remplace le titre d'une fentre
*
* History:
* --------
* 14.12.94: fplanque: Created
*/
void Wnd_ChangeTitle(
WIPARAMS * pWiParams, /* In: Fentre concerne */
char * pMsz_NewTitle ) /* In: Ptr sur nouveau titre */
{
/*
* Affiche nouveau titre:
*/
wind_set( pWiParams -> handle, WF_NAME, pMsz_NewTitle );
/*
* Efface l'ancien titre de la mmoire:
*/
free_String( pWiParams -> name_adr );
/*
* la fentre Mmorise le nouveau titre:
*/
pWiParams -> name_adr = pMsz_NewTitle;
}